package com.ouc.tcp.test;

import com.ouc.tcp.message.TCP_PACKET;

import java.util.zip.CRC32;

public class CheckSum {
    /*计算TCP报文段校验和：只需校验TCP首部中的seq、ack和sum，以及TCP数据字段*/
    public static short computeChkSum(TCP_PACKET tcpPack) {
        int checkSum = 0;
        String seq = "" + tcpPack.getTcpH().getTh_seq(); // 确认序列
        String ack = "" + tcpPack.getTcpH().getTh_ack(); // TCP ACK字段
        String sum = "" + tcpPack.getTcpH().getTh_sum(); // 校验和
        int[] data = tcpPack.getTcpS().getData(); // 获取数据部分

        String checkSeq = seq + ack;
        // 将数据部分装入checkSeq
        for (int i = 0; i < data.length; i++) {
            checkSeq += data[i];
        }

        //执行CRC算法
        byte[] check = checkSeq.getBytes();//用于验证的数据
        CRC32 c = new CRC32();
        c.reset();//Resets CRC-32 to initial value.
        c.update(check, 0, check.length);//将数据丢入CRC32解码器
        checkSum = (int) c.getValue();//获取CRC32 的值  默认返回值类型为long 用于保证返回值是一个正数
        return (short) checkSum;
    }

}
